package iface.aplicativo.negocio.aps;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.integracao.dao.CategoriaDAO;
import iface.aplicativo.negocio.entidade.Categoria;
import iface.aplicativo.util.Constantes;
import iface.aplicativo.util.ResourceMessageFactory;
import iface.aplicativo.util.UtilResource;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.utilitario.ResourceMessageAnnotation;

import java.util.Collection;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true, rollbackFor = { Exception.class })
public class ManterCategoriasAPS {

	@ResourceMessageAnnotation(propertiesFile = { Constantes.RECURSO_MENSAGENS })
	private UtilResource resource = ResourceMessageFactory.inicialize(this);

	@Resource
	CategoriaDAO categoriaDAO;

	@Transactional(propagation = Propagation.REQUIRED)
	public String salvarCategoria(Categoria entidade) throws Exception {
		this.validarCamposCategoria(entidade);
		this.validarExistencia(entidade);

		if (entidade.getId() == null) {
			this.categoriaDAO.inserir(entidade);
			return this.resource.getMensagens("MSG01");
		} else {
			this.categoriaDAO.alterar(entidade);
			return this.resource.getMensagens("MSG02");
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public String excluirCategoria(Categoria entidade) throws Exception {
		try {
			this.categoriaDAO.remover(entidade);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return this.resource.getMensagens("MSG03");
	}

	public void validarCamposCategoria(Categoria entidade) throws Exception {
		this.resource.clearMensagens();

		if (entidade != null) {
			if (UtilString.isVazio(entidade.getNmCategoria())) {
				this.resource.addMensagens("MSG05", "Categoria");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public void validarExistencia(Categoria entidade) throws Exception {
		this.resource.clearMensagens();

		Categoria categoriaConsulta = this.categoriaDAO
				.consultarPorNomeCategoria(entidade);

		if (categoriaConsulta != null) {
			this.categoriaDAO.getHibernateTemplate().clear();
			if (entidade.getId() != null) {
				if (!categoriaConsulta.getId().equals(entidade.getId())) {
					this.resource.addMensagens("MSG17");
				}
			} else {
				this.resource.addMensagens("MSG17");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public Categoria consultarModeloPorNome(String nmCategoria)
			throws Exception {
		Categoria entidade = null;
		try {
			entidade = this.categoriaDAO.obter(nmCategoria);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Categoria consultarCategoriaPorId(Long id) throws Exception {
		Categoria entidade = null;
		try {
			entidade = this.categoriaDAO.obter(id);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Collection<Categoria> consultarTodosCategoria() {
		return this.categoriaDAO.consultar();
	}

}
